#include <bits/stdc++.h>
using namespace std;
using ll = long long;
#define lson (p << 1)
#define rson (p << 1 | 1)
struct node {
  ll minn, cnt, lazy;
  // 分别表示区间最小值、区间内未用完的产品个数、区间减少数量的
  // lazy 标记
} tr[300005 << 2];

ll A[300005]; // 初始数量

// 答案上传
void push_up(int p) {
  tr[p].minn = min(tr[lson].minn, tr[rson].minn); // 区间最小值
  tr[p].cnt = tr[lson].cnt + tr[rson].cnt;        // 未用完的产品数量 取总和
}

// 标记下传
void push_down(int p) {
  if (tr[p].lazy == 0)
    return;

  tr[lson].minn -= tr[p].lazy;
  tr[lson].lazy += tr[p].lazy;

  tr[rson].minn -= tr[p].lazy;
  tr[rson].lazy += tr[p].lazy;
  tr[p].lazy = 0;
}

// 建树
void build(int l, int r, int p = 1) {
  if (l == r) {
    tr[p].minn = A[l];
    tr[p].cnt = 1;
    return;
  }
  int mid = l + r >> 1;
  build(l, mid, lson);
  build(mid + 1, r, rson);
  push_up(p);
}

// 查询答案
ll update_and_query(int ql, int qr, int cl, int cr, ll k, int p = 1) {
  if (tr[p].cnt == 0)
    return 0;

  // 区间被问题完全包含，且每件物品都至少有 k 件
  if (ql <= cl && cr <= qr && tr[p].minn > k) {
    tr[p].minn -= k;
    tr[p].lazy += k;
    return tr[p].cnt * k;
  }

  // 当前点是叶子结点，能运行到这里说明当前物品剩余数量不足 k 件
  if (cl == cr) {
    ll res = tr[p].minn;
    tr[p].cnt = 0;
    tr[p].minn = 1e18; // 防止对还有库存的物品在取 min 时造成影响
    return res;
  }

  push_down(p);
  int mid = cl + cr >> 1;
  ll res = 0;

  if (ql <= mid)
    res += update_and_query(ql, qr, cl, mid, k, lson);
  if (qr > mid)
    res += update_and_query(ql, qr, mid + 1, cr, k, rson);

  push_up(p);
  return res;
}

int main() {
  int N;
  cin >> N;
  for (int i = 1; i <= N; i++)
    cin >> A[i];
  build(1, N);
  int Q;
  cin >> Q;
  while (Q--) {
    int l, r, k;
    cin >> l >> r >> k;
    cout << update_and_query(l, r, 1, N, k) << "\n";
  }
  return 0;
}